package cn.yuanqiao.archive.wenjianzhengli.utils;

import cn.hutool.core.img.ImgUtil;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public abstract class ImageFormatUtils {
    public static final String IMAGE_TYPE_GIF = "gif";// 图形交换格式
    public static final String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组
    public static final String IMAGE_TYPE_JPEG = "jpeg";// 联合照片专家组
    public static final String IMAGE_TYPE_BMP = "bmp";// 英文Bitmap（位图）的简写，它是Windows操作系统中的标准图像文件格式
    public static final String IMAGE_TYPE_PNG = "png";// 可移植网络图形
    public static final String IMAGE_TYPE_PSD = "psd";// Photoshop的专用格式Photoshop

    /*
     * 支持提取PSD、PSB中的图片
     * File input 输入文件
     * File output 输出文件
     * String outputFormat 输出格式
     * */
    public static void converter(File input, File output, String outputFormat) throws IOException {
        BufferedImage image = ImageIO.read(input);
        ImageIO.write(image, outputFormat, output);
    }

    /*
     * 支持提取PSD、PSB中的图片
     * input 输入文件流
     * output 输出文件流
     * String outputFormat 输出格式
     * */
    public static void converter(InputStream input, OutputStream output, String formatName) {
        try {
            BufferedImage image = ImageIO.read(input);
            ImageIO.write(image, formatName, output);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void transitionToImage(File inputFile, String newSuffix, File outputFile) {
        try {
            BufferedImage image = ImageIO.read(inputFile);
            ImageIO.write(image, newSuffix, outputFile);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 缩放图像（按比例缩放），目标文件的扩展名决定目标文件类型
     *
     * @param input  源图像文件
     * @param output 缩放后的图像文件，扩展名决定目标类型
     * @param scale  缩放比例。比例大于1时为放大，小于1大于0为缩小
     */
    public static void scale(File input, File output, float scale) {
        ImgUtil.scale(input, output, scale);
    }

    /**
     * 缩放图像（按比例缩放）<br>
     * 缩放后默认为jpeg格式，此方法并不关闭流
     *
     * @param srcStream  源图像来源流
     * @param destStream 缩放后的图像写出到的流
     * @param scale      缩放比例。比例大于1时为放大，小于1大于0为缩小
     * @since 3.0.9
     */
    public static void scale(InputStream srcStream, OutputStream destStream, float scale) {
        ImgUtil.scale(srcStream, destStream, scale);
    }

    /**
     * 缩放图像（按长宽缩放）<br>
     * 注意：目标长宽与原图不成比例会变形
     *
     * @param input  源图像来源流
     * @param width  目标宽度
     * @param height 目标高度
     * @return {@link Image}
     * @since 3.1.0
     */
    public static Image scale(File input, int width, int height) throws IOException {
        return ImgUtil.scale(ImageIO.read(input), width, height);
    }

    /*
     * 转成黑白的
     * */
    public static void gray(File input, File output) {
        ImgUtil.gray(input, output);
    }

    public static void pressText(File input, File output, String text) {
        ImgUtil.pressText(input, output, text, Color.WHITE, //文字
                new Font("仿宋", Font.BOLD, 100), //字体
                0, //x坐标修正值。 默认在中间，偏移量相对于中间偏移
                0, //y坐标修正值。 默认在中间，偏移量相对于中间偏移
                0.75f//透明度：alpha 必须是范围 [0.0, 1.0] 之内（包含边界值）的一个浮点数字
        );
    }

    public static void pressImage(File input, File output, File img) throws IOException {
        ImgUtil.pressImage(input, output, ImageIO.read(input), //图片
                0, //x坐标修正值。 默认在中间，偏移量相对于中间偏移
                0, //y坐标修正值。 默认在中间，偏移量相对于中间偏移
                0.75f//透明度：alpha 必须是范围 [0.0, 1.0] 之内（包含边界值）的一个浮点数字
        );
    }

 /*   public static void main(String[] args) throws IOException {
        //converter(new File("D:\\testfile\\测试psd文件.psd"),new File("D:\\testfile\\测试psd文件.jpg"),"jpg");
        ImgUtil.convert(new File("D:\\testfile\\a.psd"),new File("D:\\testfile\\psd.jpg"));
    }*/
}
